home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 May / PCpro_2006_05.ISO / files / mobile / fma-2.0-stable-setup.exe / {app} / source / uTrayIcon.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-07-14  |  6.1 KB  |  232 lines

  1. unit uTrayIcon;
  2.  
  3. { WARNING!! This unit will not compile! Its for demontration only }
  4.  
  5. uses
  6.   Windows, ShellAPI, uVersion;
  7.  
  8. interface
  9.  
  10. const
  11.   ID_MYTRYICON = 101;
  12.   WM_MYTRYICON = WM_USER + ID_MYTRYICON + 1;
  13.  
  14.   {$EXTERNALSYM NIN_SELECT}
  15.   NIN_SELECT     = WM_USER + 0;
  16.   {$EXTERNALSYM NINF_KEY}
  17.   NINF_KEY       = $01;
  18.   {$EXTERNALSYM NIN_KEYSELECT}
  19.   NIN_KEYSELECT  = NIN_SELECT or NINF_KEY;
  20.   {$EXTERNALSYM NIN_BALLOONSHOW}
  21.   NIN_BALLOONSHOW      = WM_USER + 2;
  22.   {$EXTERNALSYM NIN_BALLOONHIDE}
  23.   NIN_BALLOONHIDE      = WM_USER + 3;
  24.   {$EXTERNALSYM NIN_BALLOONTIMEOUT}
  25.   NIN_BALLOONTIMEOUT   = WM_USER + 4;
  26.   {$EXTERNALSYM NIN_BALLOONUSERCLICK}
  27.   NIN_BALLOONUSERCLICK = WM_USER + 5;
  28.   {$EXTERNALSYM NIM_SETFOCUS}
  29.   NIM_SETFOCUS    = $00000003;
  30.   {$EXTERNALSYM NIM_SETVERSION}
  31.   NIM_SETVERSION  = $00000004;
  32.   {$EXTERNALSYM NOTIFYICON_VERSION}
  33.   NOTIFYICON_VERSION = 3;
  34.   {$EXTERNALSYM NIF_STATE}
  35.   NIF_STATE       = $00000008;
  36.   {$EXTERNALSYM NIF_INFO}
  37.   NIF_INFO        = $00000010;
  38.   {$EXTERNALSYM NIF_GUID}
  39.   NIF_GUID        = $00000020;
  40.   {$EXTERNALSYM NIS_HIDDEN}
  41.   NIS_HIDDEN       = $00000001;
  42.   {$EXTERNALSYM NIS_SHAREDICON}
  43.   NIS_SHAREDICON   = $00000002;
  44.   // says this is the source of a shared icon
  45.   // Notify Icon Infotip flags
  46.   {$EXTERNALSYM NIIF_NONE}
  47.   NIIF_NONE        = $00000000;
  48.   // icon flags are mutualy exclusive
  49.   // and take only the lowest 2 bits
  50.   {$EXTERNALSYM NIIF_INFO}
  51.   NIIF_INFO        = $00000001;
  52.   {$EXTERNALSYM NIIF_WARNING}
  53.   NIIF_WARNING     = $00000002;
  54.   {$EXTERNALSYM NIIF_ERROR}
  55.   NIIF_ERROR       = $00000003;
  56.   {$EXTERNALSYM NIIF_ICON_MASK}
  57.   NIIF_ICON_MASK   = $0000000F;
  58.   {$EXTERNALSYM NIIF_NOSOUND}
  59.   NIIF_NOSOUND     = $00000010;
  60.  
  61.   { Info Sender ID }
  62.   SID_CPU          = $00010000;
  63.   SID_CLIENT       = $00020000;
  64.   SID_NETWORK      = $00030000;
  65.   SID_OTHER        = $00040000;
  66.   SID_MASK         = $000F0000;
  67.  
  68. type
  69.   { Version 6 of NotifyIconData }
  70.   TNotifyIconDataA = record
  71.     cbSize: DWORD;
  72.     Wnd: HWND;
  73.     uID: UINT;
  74.     uFlags: UINT;
  75.     uCallbackMessage: UINT;
  76.     hIcon: HICON;
  77.     szTip: array [0..127] of AnsiChar;
  78.     dwState: DWORD;
  79.     dwStateMask: DWORD;
  80.     szInfo: array [0..255] of AnsiChar;
  81.     uTimeout: UINT;
  82.     szInfoTitle: array [0..63] of AnsiChar;
  83.     dwInfoFlags: DWORD;
  84.     guidItem: TGUID;
  85.   end;
  86.   TNotifyIconDataW = record
  87.     cbSize: DWORD;
  88.     Wnd: HWND;
  89.     uID: UINT;
  90.     uFlags: UINT;
  91.     uCallbackMessage: UINT;
  92.     hIcon: HICON;
  93.     szTip: array [0..127] of WideChar;
  94.     dwState: DWORD;
  95.     dwStateMask: DWORD;
  96.     szInfo: array [0..255] of WideChar;
  97.     uTimeout: UINT;
  98.     szInfoTitle: array [0..63] of WideChar;
  99.     dwInfoFlags: DWORD;
  100.     guidItem: TGUID;
  101.   end;
  102.   TNotifyIconData = TNotifyIconDataA;
  103.  
  104. const
  105.   {$EXTERNALSYM NOTIFYICONDATAA_V1_SIZE}
  106.   NOTIFYICONDATAA_V1_SIZE = 88;
  107.   {$EXTERNALSYM NOTIFYICONDATAW_V1_SIZE}
  108.   NOTIFYICONDATAW_V1_SIZE = 152;
  109.   {$EXTERNALSYM NOTIFYICONDATA_V1_SIZE}
  110.   NOTIFYICONDATA_V1_SIZE  = NOTIFYICONDATAA_V1_SIZE;
  111.   {$EXTERNALSYM NOTIFYICONDATAA_V2_SIZE}
  112.   NOTIFYICONDATAA_V2_SIZE = sizeof(TNotifyIconDataA) - (sizeof(TGUID));
  113.   {$EXTERNALSYM NOTIFYICONDATAW_V2_SIZE}
  114.   NOTIFYICONDATAW_V2_SIZE = sizeof(TNotifyIconDataW) - (sizeof(TGUID));
  115.   {$EXTERNALSYM NOTIFYICONDATA_V2_SIZE}
  116.   NOTIFYICONDATA_V2_SIZE  = NOTIFYICONDATAA_V2_SIZE;
  117.  
  118.   { Usage, add to your form's declarations }
  119.   procedure WMMYTRYICON(var Message: TMessage); message WM_MYTRYICON;
  120.  
  121. implementation
  122.  
  123. { Sample usage procedures }
  124.  
  125. procedure TMainForm.WMMYTRYICON(var Message: TMessage);
  126. var
  127.   P: TPoint;
  128. begin
  129.   if Message.WParam = ID_MYTRYICON then
  130.     case Message.LParam of
  131.       WM_RBUTTONUP:
  132.         begin
  133.           GetCursorPos(P);
  134.           PopupMenu1.Popup(P.X,P.Y);
  135.         end;
  136.       WM_LBUTTONDOWN,
  137.       WM_LBUTTONDBLCLK:
  138.         if Visible then Hide else Show;
  139.       NIN_BALLOONHIDE,
  140.       NIN_BALLOONTIMEOUT,
  141.       NIN_BALLOONUSERCLICK:
  142.         BaloonVisible := False;
  143.     end;
  144. end;
  145.  
  146. procedure TMainForm.ShowTrayIcon;
  147. var
  148.   R: TNotifyIconData;
  149. begin
  150.   FillChar(R,SizeOf(R),0);
  151.   R.cbSize := NIBSize;
  152.   R.Wnd := Handle;
  153.   R.uID := ID_MYTRYICON;
  154.   R.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
  155.   R.uCallbackMessage := WM_MYTRYICON;
  156.   R.hIcon := Application.Icon.Handle;
  157.   {}
  158.   StrCopy(@R.szTip[0],PChar(Copy(Application.Title,1,63)));
  159.   {
  160.   if NIBSize = NOTIFYICONDATA_V1_SIZE then
  161.     StrCopy(@R.szTip[0],PChar(Copy(Application.Title,1,63)))
  162.   else
  163.     R.szTip[0] := #0;
  164.   }
  165.   Shell_NotifyIcon(NIM_ADD,@R);
  166. end;
  167.  
  168. procedure TMainForm.ToolipTrayIcon; // change tooltip
  169. var
  170.   R: TNotifyIconData;
  171.   B: TRarBar;
  172. begin
  173.   FillChar(R,SizeOf(R),0);
  174.   R.cbSize := NIBSize;
  175.   R.Wnd := Handle;
  176.   R.uID := ID_MYTRYICON;
  177.   R.uFlags := NIF_TIP;
  178.   StrCopy(@R.szTip[0],PChar('CPU utilization is too high!',1,63)));
  179.   Shell_NotifyIcon(NIM_MODIFY,@R);
  180. end;
  181.  
  182. procedure TMainForm.InfoTrayIcon; // show baloon
  183. var
  184.   R: TNotifyIconData;
  185. begin
  186.   if not BaloonVisible and (Tooltips.Count <> 0) then
  187.     begin
  188.       FillChar(R,SizeOf(R),0);
  189.       R.cbSize := NIBSize;
  190.       R.Wnd := Handle;
  191.       R.uID := ID_MYTRYICON;
  192.       R.uFlags := NIF_INFO;
  193.       R.uTimeout := 3000;
  194.       { Remember which object has raised the baloon 
  195.       R.dwInfoFlags := DWORD(AnObjectVariable) and NIIF_ICON_MASK;
  196.       }
  197.       StrCopy(@R.szInfo[0],PChar(Copy('Some text here...',1,255)));
  198.       StrCopy(@R.szInfoTitle[0],PChar('Title'));
  199.       Shell_NotifyIcon(NIM_MODIFY,@R);
  200.  
  201.       BaloonVisible := True;
  202.     end;
  203. end;
  204.  
  205. procedure TMainForm.HideTrayIcon;
  206. var
  207.   R: TNotifyIconData;
  208. begin
  209.   FillChar(R,SizeOf(R),0);
  210.   R.cbSize := NIBSize;
  211.   R.Wnd := Handle;
  212.   R.uID := ID_MYTRYICON;
  213.   R.uFlags := NIF_ICON;
  214.   Shell_NotifyIcon(NIM_DELETE,@R);
  215. end;
  216.  
  217. procedure TMainForm.CalculateTrayIconStructureSize;
  218. var
  219.   s: string;
  220. begin
  221.   SetLength(s,MAX_PATH);
  222.   SetLength(s,GetSystemDirectory(PChar(s),MAX_PATH));
  223.   s := ExtractFileVersionInfo(s+'\shell32.dll','FileVersion');
  224.   if(s[1] = '6') then NIBSize := sizeof(TNotifyIconData)
  225.     else if(s[1] = '5') then NIBSize := NOTIFYICONDATA_V2_SIZE
  226.       else NIBSize := NOTIFYICONDATA_V1_SIZE;
  227. end;
  228.  
  229. initialization
  230.   CalculateTrayIconStructureSize;
  231. end.
  232.